home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / programming / other / gui4cli / ext / gcsound / src / docommands.h next >
C/C++ Source or Header  |  1999-05-14  |  7KB  |  263 lines

  1.  
  2.  
  3. // ===============================================================
  4. //    do the commands
  5. //    return 0 = OK, -1 = Quit - otherwise = error code
  6. //    call function this way, so that we can also use arexx msgs
  7. // ===============================================================
  8.  
  9. docommand (LONG com, struct base *bs, 
  10.            UBYTE *arg0, UBYTE *arg1, UBYTE *arg2, UBYTE *arg3)
  11. {
  12. struct myhandle *h = NULL;
  13. LONG   num, ret = 5;    // default - return warn
  14. struct DosLibrary *DOSBase;
  15. struct ExecBase *SysBase;
  16. DOSBase=bs->dosbase; SysBase=bs->sysbase;
  17.  
  18. switch (com)
  19. {
  20.   case LOAD :                // ------- LOAD
  21.     if (arg0 && arg1)
  22.     {   // see if sample already exists
  23.         makeupper (arg1);
  24.         if (h = findsample(arg1, bs->toph))
  25.         {   Printf ("Sample %s already loaded\n", arg1);
  26.             return (5);
  27.         }
  28.         if (h = loadsample (arg0, bs))
  29.         {   initsample (h, arg1, bs);  // in iff.h
  30.             ret = 0; // return ok
  31.     }   }
  32.     break;
  33.  
  34.   case UNLOAD :                // -------- UNLOAD
  35.     // if nothing passed, free all samples
  36.     if (!arg0 || !arg0[0])
  37.     {   killall (bs);
  38.     ret = 0;
  39.     }
  40.     else if (h = findsample(arg0, bs->toph))
  41.     {
  42.     if ((!h->out1) && (!h->out2))    // if not playing, kill
  43.     {   remlink (h);
  44.         freehandle (h);
  45.     }
  46.         else if (!h->killflag)
  47.     {   abortsound (h);
  48.             h->killflag = 1;   // will be deleted in gcsound.c
  49.         }
  50.         ret = 0;
  51.     }
  52.     break;
  53.  
  54.   case PLAY :                // -------- PLAY
  55.     if (h = findsample(arg0, bs->toph))
  56.     {
  57.     // return ok if sample is already playing
  58.     if ((h->out1) || (h->out2)) return (0);  
  59.  
  60.         // get settings, if sent.. (times, volume, speed
  61.     get_args (h, bs, arg1, arg2, arg3);
  62.  
  63.     if (h->reload)  // reload big samples before replaying
  64.         reload (h);
  65.     if (playsound (h, DOSBase, SysBase))
  66.         ret = 0;
  67.     }
  68.     break;
  69.  
  70.   case SOUND :                // -------- SOUND - load,play,quit
  71.     if (!(h = loadsample (arg0, bs)))
  72.        return (10);
  73.     initsample (h, "SOUND", bs);
  74.  
  75.     // get settings, if sent.. (times, volume, speed)
  76.     get_args (h, bs, arg1, arg2, arg3);
  77.  
  78.     h->killflag = 1;  // mark it for deletion
  79.     if (playsound (h, DOSBase, SysBase))
  80.     ret = 0;
  81.     else    // if failed to play, kill immediately
  82.     {  remlink (h);
  83.        freehandle (h);
  84.     }
  85.     break;
  86.  
  87.   case VOLUME :                // -------- VOLUME
  88.     if (h = findsample(arg0, bs->toph))
  89.     {   if (arg1)    // get volume
  90.         {   if ((StrToLong (arg1, &num)) > 0)
  91.             {   if (num < 0) num = 64;
  92.                 else if (num > 64) num = 64;
  93.         h->volume = num;
  94.         if (setVolSpeed(h)) ret = 0;
  95.     }   }   }
  96.     break;
  97.  
  98.   case SPEED :                // -------- SPEED
  99.     if (h = findsample(arg0, bs->toph))
  100.     {   if (arg1)    // get speed
  101.         {   if ((StrToLong (arg1, &num)) > 0)
  102.             {    if ((num > 124) && (num < 1000))
  103.            h->speed = num;
  104.         else  // use default
  105.            h->speed = bs->clock / h->vh.vh_SamplesPerSec;
  106.         if (setVolSpeed(h)) ret = 0;
  107.     }   }   }
  108.     break;
  109.  
  110.   case TIMES :                // -------- TIMES
  111.     if (h = findsample(arg0, bs->toph))
  112.     {   if (arg1)    // get times - change only if small samp
  113.         {   if ((StrToLong (arg1, &num)) > 0)
  114.             {   if (num < 0) num = 0;
  115.         h->times = num;
  116.         ret = 0;
  117.         // how to change times ????
  118.     }   }   }
  119.     break;
  120.  
  121.   case INFO :                 // -------- INFO
  122.     if (h = findsample(arg0, bs->toph))
  123.     {    // store "volume speed" of sample into return buffer
  124.         stcl_d (bs->retbuff, h->volume);
  125.         strcat (bs->retbuff, " ");
  126.         stcl_d (&bs->retbuff[strlen(bs->retbuff)], h->speed);
  127.         ret = 0;
  128.     }
  129.     break;
  130.  
  131.   case STOP :                // -------- STOP
  132.     // if no alias passed, stop all samples
  133.     if (!arg0 || !arg0[0])
  134.     {  ret = 0;
  135.        for (h = bs->toph; h; h = h->next)
  136.        {   // if msgs outstanding, abort
  137.            if (h->out1 || h->out2)
  138.                abortsound (h);
  139.     }  }
  140.     else if (h = findsample(arg0, bs->toph))
  141.     {   ret = 0;
  142.     abortsound (h);
  143.     }
  144.     break;
  145.  
  146.   case QUIT :                // -------- QUIT
  147.     --bs->users; // do not quit if there are still users..
  148.     if (bs->users > 0) return (0);
  149.     killall (bs);
  150.     return (-1);     // return quit
  151.     break;
  152.  
  153. };  // end of switch
  154.  
  155. return (ret);
  156. }
  157.  
  158. // ===============================================================
  159. //    find the sample by alias, return handle or null
  160. // ===============================================================
  161.  
  162. struct myhandle *findsample (char *alias, struct myhandle *toph)
  163. {
  164.    struct myhandle *h;
  165.  
  166.    if (!alias || !alias[0]) return (NULL);
  167.    makeupper (alias);
  168.  
  169.    for (h=toph; h; h=h->next)
  170.    {  if (!strcmp (h->alias, alias))
  171.       {  return (h);
  172.    }  }
  173.    return (NULL);
  174. }
  175.  
  176. // ===============================================================
  177. //    get times/spped/volume
  178. //    use functions since it's called twice
  179. // ===============================================================
  180.  
  181. void get_args (struct myhandle *h, struct base *bs,
  182.                UBYTE *arg1, UBYTE *arg2, UBYTE *arg3)
  183. {
  184.     LONG num;
  185.     struct DosLibrary *DOSBase;
  186.     struct ExecBase *SysBase;
  187.     DOSBase=bs->dosbase; SysBase=bs->sysbase;
  188.  
  189.     // get settings, if sent.. (times, volume, speed
  190.     if (arg1)        // times
  191.     {   if ((StrToLong (arg1, &num)) > 0)
  192.         {   if (num < 0) num = 1;
  193.         h->times = num;
  194.     }   }
  195.     if (arg2)        // volume
  196.     {   if ((StrToLong (arg2, &num)) > 0)
  197.         {   if ((num < 1) || (num > 64)) num = 64;
  198.         h->volume = num;
  199.     }   }
  200.     if (arg3)        // speed - leave untouched if out of range
  201.     {   if ((StrToLong (arg3, &num)) > 0)
  202.         {   if ((num > 124) && (num < 1000))
  203.         h->speed = num;
  204.         else  // use default
  205.         h->speed = bs->clock / h->vh.vh_SamplesPerSec;
  206.     }   }
  207. }
  208.  
  209. // ==============================================================
  210. //    killall
  211. //     abort and kill all samples (used in unload and quit)
  212. // ==============================================================
  213. void killall (struct base *bs)
  214. {
  215.     struct myhandle *hh, *h;
  216.  
  217.     for (h = bs->toph; h;)
  218.     {   // if no msgs outstanding, kill it
  219.         if ((!h->out1) && (!h->out2))
  220.         {   hh = h;
  221.         h = h->next;
  222.         remlink (hh);
  223.         freehandle (hh);
  224.     }
  225.     else  // otherwise abort & mark
  226.     {   abortsound (h);
  227.         h->killflag = 1;
  228.         h = h->next;
  229.     }
  230. }   }
  231.  
  232. // ==============================================================
  233. //    makeret
  234. //     place "volume speed" into bs->msgret buffer
  235. // ==============================================================
  236. void makeret (struct myhandle *h)
  237. {
  238.    struct base *bs;
  239.    struct DosLibrary *DOSBase;
  240.    struct ExecBase *SysBase;
  241.    bs = h->bs;
  242.    DOSBase=bs->dosbase; SysBase=bs->sysbase;
  243.  
  244.    stcl_d (bs->retbuff, h->volume);
  245.    strcat (bs->retbuff, " ");
  246.    stcl_d (&bs->retbuff[strlen(bs->retbuff)], h->speed);
  247. }
  248.  
  249. // ==============================================================
  250. // convert string to UPPER case 
  251. // (since stricpm doesn't work without the startup code)
  252. // ==============================================================
  253. void makeupper (UBYTE *str)
  254. {
  255.    if (!str) return;
  256.    while (*str)
  257.    {   if ((*str >= 'a') && (*str <= 'z')) *str -= 32;
  258.        ++str;
  259.    } 
  260. }
  261.  
  262.  
  263.